/*
 * server_util.c
 *
 *  Created on: Jan 24, 2011
 *      Author: marco
 */
#include "msg.h"
#include "server_util.h"




/**
 * compare è solo sul nome si potrebbe fare anche su sfd.. direttamente qui
 * @param a
 * @param b
 * @return
 */
int compare_user(void *a, void *b) {
	char *_a;
	char *_b;
	_a = (char *) a;
	_b = (char *) b;
	return strcmp(_a, _b);
}


/**
 *
 * @param u
 */
void * copy_user(void *u) {
	user * _u;
	user *nu;
	_u = (user *) u;
	EC_NULL_E(nu = (user*)malloc(sizeof(user)),ERR_MEM);
	EC_NULL_E(nu->name = strdup(_u->name) ,ERR_MEM);
	nu->sfd = _u->sfd;
	nu->tid = _u->tid;
	return (void *) nu;
}

/* funzione di copia di un intero */
/**
 *
 * @param a
 */
void * copy_int(void *a) {
	int * _a;

	if ((_a = malloc(sizeof(int))) == NULL)
		return NULL;

	*_a = *(int *) a;
	return (void *) _a;
}

/* funzione di copia di una stringa */
void * copy_string(void * a) {
	char * _a;

	if ((_a = strdup((char *) a)) == NULL)
		return NULL;

	return (void *) _a;
}


void free_user(user* u) {
	free(u->name);
	u->name = NULL;
	free(u);
	u = NULL;
}


/*Funzioni sulla lista utenti online*/
int insert_user_l(user_pointers_l *list, user *u){
	/*non c'è bisogno di cercare se c'è già l'utente online, già verificato prima */
	/*deve solo inserire il puntatore nella lista*/
	user_pointer_t *up;
	/*Inserimento in testa*/
	if(list->head == NULL){
		EC_NULL_E(list->head = malloc(sizeof(user_pointer_t)),ERR_MEM);
		list->head->next = NULL;
		list->head->user = u;
		return 1;
	}
	up = list->head;
	/*Scorre la lista fino in fondo*/
	while(up->next != NULL){
		up = up->next;
	}
	EC_NULL_E(up->next = malloc(sizeof(user_pointer_t)),ERR_MEM);
	up->next->next = NULL;
	up->next->user = u;
	return 1; //!
}





int remove_user_l(user_pointers_l *list, char* name){

	user_pointer_t *p;
	user_pointer_t *prev = NULL;

	p = list->head->next;
	/*Si controlla l'elemento in testa*/
	if(strcmp(list->head->user->name, name) == 0){
		list->head->user = NULL;
		free(list->head);
		if(p == NULL){
			//printf("remove_user_l NULL dopo testa eliminata\n");
			list->head = NULL;
		}
		list->head = p;
		return 1;
	}

	/*Elemento non in testa, scorre la lista*/
	prev = list->head;
	while(p != NULL){
		if(strcmp(p->user->name, name) == 0){/*p punta all'elemento da eliminare*/
			/*utente trovato*/
			prev->next = p->next; /*sposta i puntatori */
			p->user = NULL;/*si elimina l'elemento*/
			free(p);
			return 1;
		}
		p = p->next;
	}
	/*Utente non online*/
	return 1;
}

user* search_user_l(user_pointers_l *list, char *name){
	user_pointer_t *p;
	p = list->head;
	while(p != NULL){
		if(strcmp(p->user->name, name) == 0){
			return(p->user);
		}
		p = p->next;
	}
	/*Utente non online*/
	return NULL;
}


